package org.springframework.core.convert.support;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;

/**
 * 实现了字符串转数字类型的转换工厂
 */
public class StringToNumberConverterFactory implements ConverterFactory<String, Number> {

    /**
     * 获取指定的类型转换器
     * @param targetType
     * @return
     * @param <T>
     */
    @Override
    public <T extends Number> Converter<String, T> getConverter(Class<T> targetType) {
        //直接返回字符串转数字的转换器
        return new StringToNumber<T>(targetType);
    }

    /**
     * 工厂内部本质还是使用了Converter普通转换器
     * 注意这里泛型类实现泛型接口是如何书写的 这里实现了 字符串 转换容易数字类型
     * @param <T>
     */
    private static final class StringToNumber <T extends Number> implements Converter<String, T>{

        private final Class<T> targetType;

        public StringToNumber(Class<T> targetType) {
            this.targetType = targetType;
        }


        /**
         * 将字符串转换为具体的目标数字类型的代码
         * @param source
         * @return
         */
        @Override
        public T convert(String source) {
            //字符串没有内容就返回null
            if(source.isEmpty()){
                return null;
            }

            //根据类型解析字符串 并且返回
            if(targetType.equals(Integer.class)){
                return (T) Integer.valueOf(source);
            }else if (targetType.equals(Long.class)) {
                return (T) Long.valueOf(source);
            }
            //TODO 其他数字类型

            //没有能解析的 说明字符串有问题报错
            else {
                throw new IllegalArgumentException(
                        "Cannot convert String [" + source + "] to target class [" + targetType.getName() + "]");
            }
        }
    }
}
